home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / utilities / pu015.dms / pu015.adf / StarChart / Source / star2.c < prev    next >
C/C++ Source or Header  |  1989-09-24  |  27KB  |  790 lines

  1. /*=========================================================================
  2.   Star2.c -- This module handles menu selection and dispatching
  3.   for the Star Chart program.
  4.   
  5.   The menus used in this module were build using David Pehrson's MenuEd.
  6.  
  7.   Credits for Star Chart:
  8.        Robert L. Hill of the Orange County, CA. Amiga Friends User Group
  9.                       wrote the original version of StarChart in AmigaBasic
  10.                       The star data and many of the main functions of this
  11.                       version are derived from that program.
  12.  
  13.        Ray R. Larson  wrote the c version 1.0 of StarChart, 'intuitionizing'
  14.                       and enhancing the speed and functions of the original.
  15.  
  16.   Copyright (c) 1986 by Ray R. Larson
  17.   
  18.   This program may be freely distributed and copied, but may not be sold
  19.   without the permission of the author. If you modify or enhance it, 
  20.   please include the above credits (and please send me a copy!).
  21.  
  22. Ray R. Larson
  23. 6425 Central Ave. #304
  24. El Cerrito, CA 94530
  25.  
  26. BitNet  LARSON@UCBCMSA
  27. =========================================================================*/
  28. /*------------Header file for all of the standard stuff----*/ 
  29. /*-------------plus definitions of global structures-------*/
  30. #include "star.h" 
  31. #include <time.h>
  32.  
  33. /*---------------- External functions and variables -------*/
  34. extern BOOL FileRequest();
  35. extern struct Window *w;
  36. extern struct ViewPort *vport;
  37. extern struct star_rec StarTable[];
  38. extern struct Coord coords[];
  39. extern struct cons_rec Constel[];
  40. extern char *Greek[];
  41. extern SHORT *ConstList[];
  42. extern SHORT *GreekList[];
  43. extern FLOAT MaxPlus, MaxWhite;
  44. extern struct ParamStruct Parms;
  45. extern UBYTE WinTitle[]; /* default window title */
  46. SHORT ZodCons[] = {2,5,9,13,29,33,35,46,49,50,54,59};
  47. extern UWORD defaultCT[32], CTable[32], *ctabptr; /* color tables */
  48.  
  49.  
  50. struct IntuiText ProjItemText[] =
  51. {
  52. /* 0 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"About StarChart...", NULL },
  53. /* 1 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Locate Star by Common Name", NULL },
  54. /* 2 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Locate Star by Greek Name", NULL },
  55. /* 3 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Constellation Menu", NULL },
  56. /* 4 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Help", NULL },
  57. /* 5 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Print Help Info", NULL },
  58. /* 6 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Exit", NULL },
  59. };
  60.  
  61. struct IntuiText SubItemText[] =
  62. {
  63. /* 0 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)" To Printer", NULL },
  64. /* 1 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)" To File", NULL },
  65. };
  66.  
  67. struct IntuiText ParmItemText[] =
  68. {
  69. /* 0 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Set Parameters", NULL },
  70. /* 1 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Save Parameters", NULL },
  71. /* 2 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Load Parameters", NULL },
  72. /* 3 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Restore Parameters", NULL },
  73. /* 4 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Use System Time", NULL },
  74. /* 5 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Help for Parameters", NULL },
  75. };
  76. struct IntuiText OptItemText[] =
  77. {
  78. /* 0 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Change Magnitude Display Levels", NULL },
  79. /* 1 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Change Sidereal Clock Speed", NULL },
  80. /* 2 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"   Display Both Star & Info", NULL },
  81. /* 3 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"   Display Star Only", NULL },
  82. /* 4 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"   Display Info Only", NULL },
  83. /* 5 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Change Screen Colors", NULL },
  84. /* 6 */    { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Help for Options", NULL },
  85. };
  86.  
  87. struct MenuItem SubItems[] =
  88. {
  89. /* 0 */    {
  90.         &SubItems[1], 131, 0, 120, 10, ITEMENABLED | ITEMTEXT | HIGHCOMP,
  91.         0, (APTR)&SubItemText[0], NULL, '1', NULL, NULL 
  92.     },
  93. /* 1 */    {
  94.         NULL, 131, 10, 120, 10, ITEMENABLED | ITEMTEXT | HIGHCOMP,
  95.         0, (APTR)&SubItemText[1], NULL, '2', NULL, NULL 
  96.     }
  97. };
  98.  
  99. struct MenuItem ProjItems[] =
  100. {
  101. /* 0 */    {
  102.         &ProjItems[1], 0, 0, 251, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  103.         0, (APTR)&ProjItemText[0], NULL, 'A', NULL, NULL 
  104.     },
  105. /* 1 */    {
  106.         &ProjItems[2], 0, 10, 251, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  107.         0, (APTR)&ProjItemText[1], NULL, 'L', NULL, NULL 
  108.     },
  109. /* 2 */    {
  110.         &ProjItems[3], 0, 20, 251, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  111.         0, (APTR)&ProjItemText[2], NULL, 'G', NULL, NULL 
  112.     },
  113. /* 3 */    {
  114.         &ProjItems[4], 0, 30, 251, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  115.         0, (APTR)&ProjItemText[3], NULL, 'C', NULL, NULL 
  116.     },
  117. /* 4 */    {
  118.         &ProjItems[5], 0, 40, 251, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  119.         0, (APTR)&ProjItemText[4], NULL, 'H', NULL, NULL 
  120.     },
  121. /* 5 */    {
  122.         &ProjItems[6], 0, 50, 251, 10, ITEMENABLED | ITEMTEXT | HIGHCOMP,
  123.         0, (APTR)&ProjItemText[5], NULL, '0', &SubItems[0], NULL 
  124.     },
  125. /* 6 */    {
  126.         NULL, 0, 60, 251, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  127.         0, (APTR)&ProjItemText[6], NULL, 'Q', NULL, NULL 
  128.     },
  129. };
  130.  
  131. struct MenuItem ParmItems[] =
  132. {
  133. /* 0 */    {
  134.         &ParmItems[1], 0, 0, 195, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  135.         0, (APTR)&ParmItemText[0], NULL, 'P', NULL, NULL 
  136.     },
  137. /* 1 */    {
  138.         &ParmItems[2], 0, 10, 195, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  139.         0, (APTR)&ParmItemText[1], NULL, 'S', NULL, NULL 
  140.     },
  141. /* 2 */    {
  142.         &ParmItems[3], 0, 20, 195, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  143.         0, (APTR)&ParmItemText[2], NULL, 'O', NULL, NULL 
  144.     },
  145. /* 3 */    {
  146.         &ParmItems[4], 0, 30, 195, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  147.         0, (APTR)&ParmItemText[3], NULL, 'R', NULL, NULL 
  148.     },
  149. /* 4 */    {
  150.         &ParmItems[5], 0, 40, 195, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  151.         0, (APTR)&ParmItemText[4], NULL, 'T', NULL, NULL 
  152.     },
  153. /* 5*/    {
  154.         NULL, 0, 50, 195, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  155.         0, (APTR)&ParmItemText[5], NULL, 'J', NULL, NULL 
  156.     },
  157. };
  158.  
  159. struct MenuItem OptItems[] =
  160. {
  161. /* 0*/    {
  162.         &OptItems[1], 0, 0, 291, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  163.     /* 0 */    0, (APTR)&OptItemText[0], NULL, 'M', NULL, NULL 
  164.     },
  165. /* 1*/    {
  166.         &OptItems[2], 0, 10, 291, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  167.     /* 1 */    0, (APTR)&OptItemText[1], NULL, 'D', NULL, NULL 
  168.     },
  169. /* 2*/    {
  170.         &OptItems[3], 0, 20, 291, 10, 
  171.                 CHECKIT | CHECKED | ITEMENABLED | ITEMTEXT | HIGHCOMP,
  172.     /* 2 */    0x00000018, (APTR)&OptItemText[2], NULL, ' ', NULL, NULL 
  173.     },
  174. /* 3*/    {
  175.         &OptItems[4], 0, 30, 291, 10, 
  176.                 CHECKIT | ITEMENABLED | ITEMTEXT | HIGHCOMP,
  177.     /* 3 */    0x00000014, (APTR)&OptItemText[3], NULL, ' ', NULL, NULL 
  178.     },
  179. /* 4*/    {
  180.         &OptItems[5], 0, 40, 291, 10, 
  181.                 CHECKIT | ITEMENABLED | ITEMTEXT | HIGHCOMP,
  182.     /* 4 */    0x0000000C, (APTR)&OptItemText[4], NULL, ' ', NULL, NULL 
  183.     },
  184. /* 5*/    {
  185.         &OptItems[6], 0, 50, 291, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  186.     /* 5 */    0, (APTR)&OptItemText[5], NULL, ' ', NULL, NULL 
  187.     },
  188. /* 6*/    {
  189.         NULL, 0, 60, 291, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  190.     /* 6 */    0, (APTR)&OptItemText[6], NULL, 'K', NULL, NULL 
  191.     },
  192. };
  193.  
  194. struct Menu Titles[] =
  195. {
  196.     { &Titles[1], 3, 0, 86, 0, MENUENABLED, "  Project", &ProjItems[0] },
  197.     { &Titles[2], 88, 0, 110, 0, MENUENABLED, "  Parameters", &ParmItems[0] },
  198.     { NULL, 197, 0, 86, 0, MENUENABLED, "  Options", &OptItems[0] },
  199. };
  200.  
  201. struct IntuiText Con0MenText[] =
  202. {
  203. { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"   Display Stars Only", NULL },
  204. { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"   Display Both Stars & Info", NULL },
  205. { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"   Display Info Only", NULL },
  206. { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"   Display Major Stars Only", NULL },
  207. { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Show Zodiac Constellations", NULL },
  208. { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Show Messier Objects", NULL },
  209. { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Show NGC Galaxies", NULL },
  210. { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Constellation Menus Help", NULL },
  211. { 0, 1, JAM1, 0, 1, NULL, (UBYTE *)"Return to Main Menu", NULL },
  212.  
  213. };
  214.  
  215. struct MenuItem Con0Items[] = {
  216.  {
  217.     &Con0Items[1], 0, 0, 250, 10, 
  218.         CHECKIT | CHECKED | ITEMENABLED | ITEMTEXT | HIGHCOMP,
  219.     0x00000006, (APTR)&Con0MenText[0], NULL, ' ', NULL, NULL 
  220.  },
  221.  {
  222.     &Con0Items[2], 0, 10, 250, 10, 
  223.         CHECKIT | ITEMENABLED | ITEMTEXT | HIGHCOMP,
  224.     0x00000005, (APTR)&Con0MenText[1], NULL, ' ', NULL, NULL 
  225.  },
  226.  {
  227.     &Con0Items[3], 0, 20, 250, 10, 
  228.         CHECKIT | ITEMENABLED | ITEMTEXT | HIGHCOMP,
  229.     0x00000003, (APTR)&Con0MenText[2], NULL, ' ', NULL, NULL 
  230.  },
  231.  {
  232.     &Con0Items[4], 0, 30, 250, 10, 
  233.         CHECKIT | ITEMENABLED | ITEMTEXT | HIGHCOMP | MENUTOGGLE,
  234.     0, (APTR)&Con0MenText[3], NULL, ' ', NULL, NULL 
  235.  },
  236.  {
  237.     &Con0Items[5], 0, 40, 250, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  238.     0, (APTR)&Con0MenText[4], NULL, 'Z', NULL, NULL 
  239.  },
  240.  {
  241.     &Con0Items[6], 0, 50, 250, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  242.     0, (APTR)&Con0MenText[5], NULL, 'M', NULL, NULL 
  243.  },
  244.  {
  245.     &Con0Items[7], 0, 60, 250, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  246.     0, (APTR)&Con0MenText[6], NULL, 'N', NULL, NULL 
  247.  },
  248.  {
  249.     &Con0Items[8], 0, 70, 250, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  250.     0, (APTR)&Con0MenText[7], NULL, 'H', NULL, NULL 
  251.  },
  252.  {
  253.     NULL, 0, 80, 250, 10, ITEMENABLED | ITEMTEXT | COMMSEQ | HIGHCOMP,
  254.     0, (APTR)&Con0MenText[8], NULL, 'R', NULL, NULL 
  255.  }
  256. };
  257.  
  258. /* the following are filled in by the InitConMenu */
  259. struct IntuiText ConNameText[60];
  260. struct MenuItem ConNameItems[60];
  261.  
  262. struct Menu ConTitles[] =
  263. {
  264.     { &ConTitles[1], 3, 0, 200, 0, MENUENABLED, " Constellation Options", 
  265.            &Con0Items[0] },
  266.     { &ConTitles[2], 201, 0, 120, 0, MENUENABLED, "    A - COL   ", &ConNameItems[0] },
  267.     { &ConTitles[3], 321, 0, 120, 0, MENUENABLED, "    COM - M   ", &ConNameItems[20] },
  268.     { NULL, 441, 0, 120, 0, MENUENABLED, "      O - V   ", &ConNameItems[40] },
  269. };
  270.  
  271. #define PROJECT 0L
  272. #define ABOUT 0L
  273. #define ABOUTHELP 4L
  274. #define LOCCOMMON 1L
  275. #define LOCGREEK 2L
  276. #define LOCCONS 3L
  277. #define PROJHELP 4L
  278. #define PRINTHELP 5L
  279. #define EXIT 6L
  280.  
  281. #define SUBPRT 0L
  282. #define SUBFILE 1L
  283.  
  284.  
  285. #define PARMS 1L
  286. #define SETPARM 0L
  287. #define SAVEPARM 1L
  288. #define LOADPARM 2L
  289. #define RESTRPARM 3L
  290. #define SETSYSTIME 4L
  291. #define PARMHELP 5L
  292.  
  293. #define OPTIONS 2L
  294. #define CHANGEMAG 0L
  295. #define CHANGECLK 1L
  296. #define DISBOTH 2L
  297. #define DISSTAR 3L
  298. #define DISINFO 4L
  299. #define CHANGECOL 5L
  300. #define OPTHELP 6L
  301.  
  302. #define CONOPTIONS 0L
  303. #define CONDISSTAR 0L
  304. #define CONDISBOTH 1L
  305. #define CONDISINFO 2L
  306. #define CONDISMAJ  3L
  307. #define CONDISZOD  4L
  308. #define CONDISMES  5L
  309. #define CONDISNGC  6L
  310. #define CONHELP    7L
  311. #define CONRETURN  8L
  312.  
  313. /* string buffers for file names for saving and loading parameters */
  314. extern UBYTE Name_String[];
  315. UBYTE filename[140] = "";
  316. UBYTE printfilename[140] = "";
  317. UBYTE WTMessage[80];
  318. UBYTE *starname;
  319. UBYTE grkname[40], conname[40];
  320. SHORT ErrorMessCount; /* timer count for error message */
  321.  
  322. /* DisplayFlags is used to determine how to display the star: */
  323. /* 3 for both blink and info, 1 blink only, 2 info only       */
  324. SHORT DisplayFlags = 3; 
  325.  
  326. /* ConDispFlags is used to determine how to display the constellation info */
  327. /* 3 for both show stars and info, 1 stars only, 2 info only               */
  328. /* 4 for display major stars (greek named stars) only               */
  329. SHORT ConDispFlags = 1; 
  330.  
  331. /* MenuFlag is used to determine whether the main menu or constellations */
  332. /* menu is currently active so that the proper processing can be done    */
  333. /* True is the main menu, false is the constellation menu.               */
  334. BOOL MenuFlag = TRUE;
  335.  
  336. /* InfoFlag is used to indicate if a long or short info display is needed */
  337. SHORT InfoFlag = 0; /* default is long info display */
  338.  
  339.  
  340. /* Handle menu selections */
  341. Do_menu(MenuNum,ItemNum,SubNum)
  342.   LONG MenuNum, ItemNum, SubNum;
  343. {
  344.   SHORT star, starlist[60], SearchIndex(), AndLists();
  345.   UBYTE *get_Star_Name(), *extptr, *rindex(), *index(), Greekbuf[20];
  346.   FLOAT temp, get_num_req();
  347.   BOOL fileRetCode;
  348.   extern struct FileHandle  *Open();
  349.   struct FileHandle *ParmFile;
  350.   SHORT greeklnum;
  351.   SHORT i,j, constindex, *conlist , nconstars;
  352.   LONG timestamp;
  353.   struct tm *timedat;
  354.   UBYTE lastchar;
  355.  
  356.   if (MenuFlag) { /* Main Menu */ 
  357.   switch(MenuNum) {
  358.     case PROJECT:
  359.              switch(ItemNum) {
  360.                 case ABOUT:
  361.                do_help_req(ABOUTHELP);
  362.                break;
  363.  
  364.         case LOCCOMMON:  /* locate star by name */
  365.              Name_String[0] = '\0';
  366.              starname = get_Star_Name("Enter Star Name:",NULL);
  367.              if (starname == NULL) break;
  368.                      star = SearchIndex(starname);
  369.                      if (star != 0)
  370.                         { if((coords[star].x == 0L) && (coords[star].y == 0L))
  371.                             { sprintf(WTMessage,
  372.                                       "%s is not visible at this time.",
  373.                                       starname);
  374.                               SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  375.                   ErrorMessCount = 7; /* leave it for 7 seconds */
  376.                 }
  377.               else  if (DisplayFlags & 1) BlinkStar(star,7,1,8);
  378.               if (DisplayFlags & 2)
  379.                   { starlist[0] = star;
  380.                     DisplayInfo(starlist,1,0,DisplayFlags);
  381.                   }
  382.                         }
  383.                      else /*star not in star table */
  384.                         { sprintf(WTMessage,"%s is not in the Star Table.",
  385.                                   starname);
  386.                           SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  387.               ErrorMessCount = 7; /* leave it for 7 seconds */
  388.             }
  389.              break;
  390.                                
  391.         case LOCGREEK: 
  392.              Name_String[0] = '\0';
  393.              starname = get_Star_Name("Enter Greek Star Name:",
  394.                           "E.g. ALPHA CENTAURI");
  395.              if (starname == NULL) break;
  396.                      firststr(starname,grkname,conname);
  397.                      greeklnum = SearchGreek(grkname);
  398.                      if (greeklnum == 0)
  399.                             { sprintf(WTMessage,
  400.                                       "%s is not the name of a Greek letter",
  401.                                       grkname);
  402.                               SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  403.                   ErrorMessCount = 7; /* leave it for 7 seconds */
  404.                   break;
  405.                 }
  406.              
  407.                      constindex = SearchConst(conname);
  408.                      if (constindex == 0)
  409.                             { sprintf(WTMessage,
  410.                                       " Constellation %s was not found",
  411.                                       conname);
  412.                               SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  413.                   ErrorMessCount = 7; /* leave it for 7 seconds */
  414.                   break;
  415.                 }
  416.                  star = AndLists(ConstList[constindex],GreekList[greeklnum]);
  417.                      if (star != 0)
  418.                         { if (coords[star].x == 0L)
  419.                             { sprintf(WTMessage,
  420.                                       "%s is not visible at this time.",
  421.                                       starname);
  422.                               SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  423.                   ErrorMessCount = 7; /* leave it for 7 seconds */
  424.                 }
  425.               else  if (DisplayFlags & 1) BlinkStar(star,7,1,8);
  426.               if (DisplayFlags & 2)
  427.                   { starlist[0] = star;
  428.                     DisplayInfo(starlist,1,0,DisplayFlags);
  429.                   }
  430.                         }
  431.                      else /*star not in star table */
  432.                         { sprintf(WTMessage,"%s is not in the Star Table.",
  433.                                   starname);
  434.                           SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  435.               ErrorMessCount = 7; /* leave it for 7 seconds */
  436.             }
  437.  
  438.                      break;
  439.         
  440.         case LOCCONS: /* set the constellation menu */
  441.                  ClearMenuStrip(w);
  442.                              SetMenuStrip(w,ConTitles);
  443.                              MenuFlag = FALSE;
  444.              break;
  445.                                
  446.         case PROJHELP: 
  447.                do_help_req(PROJECT);
  448.                break;
  449.  
  450.         case PRINTHELP: 
  451.                    if (SubNum == SUBFILE) {
  452.  
  453.            if(printfilename[0] == '\0')
  454.              { GetPath(printfilename);
  455.                lastchar = filename[strlen(printfilename)-1];
  456.                if((lastchar != ':') && (lastchar != '/'))
  457.                   strcat(printfilename,"/");
  458.                        strcat(printfilename,"StarChart.Manual");
  459.                      }
  460.                    if (FileRequest("Save Help Info to Which File?",
  461.                     "Save",printfilename,
  462.                                     NULL,NULL,w))
  463.              {             
  464.                if (PrintHelp(printfilename))
  465.                  { sprintf(WTMessage,"Couldn't Print to file %s!",
  466.                                   printfilename);
  467.                           SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  468.               ErrorMessCount = 7; /* leave it for 7 seconds */
  469.             }
  470.  
  471.                       }  
  472.                     }
  473.                     else
  474.                if (PrintHelp("PRT:"))
  475.                  { sprintf(WTMessage,"Couldn't Use the printer!",
  476.                                   printfilename);
  477.                           SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  478.               ErrorMessCount = 7; /* leave it for 7 seconds */
  479.             }
  480.  
  481.            break;
  482.  
  483.         case EXIT: 
  484.                   CloseThings();
  485.                exit(NULL);
  486.                break;
  487.           };
  488.              break;
  489.  
  490.     case PARMS:
  491.              switch(ItemNum) {
  492.         case SETPARM: 
  493.                   /* Let the user set parameters in the */    
  494.                   /* ParamRequester                */
  495.                   GetParams(); 
  496.                   break;
  497.  
  498.         case SAVEPARM: /* save current parameters in a file */
  499.         
  500.            if(filename[0] == '\0')
  501.              { GetPath(filename);
  502.                        lastchar = filename[strlen(filename)-1];
  503.                if((lastchar != ':') && (lastchar != '/'))
  504.                   strcat(filename,"/");
  505.                        strcat(filename,"DEFAULT.STAR");
  506.                      }
  507.                    if (FileRequest("Where to Save Parameters?",
  508.                     "Save",filename,
  509.                                     ".info",".STAR",w))
  510.              {             
  511.                 extptr = rindex(filename,'.');
  512.                 if(strcmp(extptr,".STAR") != 0)
  513.                    strcat(filename,".STAR");
  514.  
  515.                         if((ParmFile =
  516.                Open(filename,MODE_NEWFILE))==NULL)
  517.                             { sprintf(WTMessage,"Couldn't open %s for output!",
  518.                                   filename);
  519.                                SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  520.                    ErrorMessCount = 10; /* leave it for 10 seconds */
  521.                  }  
  522.             
  523.                         else { /* write out the parameters to the file */
  524.                             Write(ParmFile,&Parms,(LONG)sizeof(struct ParamStruct));
  525.                             Write(ParmFile,&CTable[0],(LONG)(32*sizeof(UWORD)));
  526.                             /* make a workbench Icon for the file */
  527.                             MakeInfoFile(filename);/* in staricon.c */
  528.                             Close(ParmFile);
  529.                             }
  530.                       }      
  531.            break;
  532.  
  533.                 case LOADPARM:
  534.                    if (FileRequest("Which Parameters to Load?",
  535.                     "Load",filename,
  536.                                     ".info",".STAR",w))
  537.              { if((ParmFile =
  538.                Open(filename,MODE_OLDFILE))==NULL)
  539.                             { sprintf(WTMessage,"Couldn't open %s for Input",
  540.                                   filename);
  541.                                SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  542.                    ErrorMessCount = 10; /* leave it for 10 seconds */
  543.                  }  
  544.             
  545.                         else { /* Read the parameters from the file */
  546.                               Read(ParmFile,&Parms,(LONG)sizeof(struct ParamStruct));
  547.                               Read(ParmFile,&CTable[0],(LONG)(32*sizeof(UWORD)));
  548.                               Close(ParmFile);
  549.                               /* change the registers to the new  colors */
  550.                               LoadRGB4(vport,&CTable,32L);
  551.                               DisplayStars();
  552.                               DisplayAllText();
  553.                             }
  554.                       }      
  555.            break;
  556.  
  557.         case RESTRPARM: 
  558.                 /* reset to the startup parameters */
  559.                 initialize();
  560.  
  561.                 break;
  562.         
  563.         case SETSYSTIME: /* read the system clock and install */
  564.                  /* current time              */
  565.                timestamp = time(NULL);
  566.                timedat = localtime(×tamp);
  567.  
  568.                Parms.Month = timedat->tm_mon + 1;
  569.                Parms.Day = timedat->tm_mday;
  570.                Parms.Year= timedat->tm_year + 1900;
  571.                Parms.Hour = timedat->tm_hour;
  572.                Parms.Minute = timedat->tm_min;
  573.                CalcParams(&Parms); /* calculate sidereal time, GST, etc. */
  574.                DisplayStars();
  575.                DisplayAllText();
  576.    
  577.             break;
  578.                    
  579.         case PARMHELP: 
  580.                do_help_req(PARMS);
  581.                break;
  582.               }
  583.               break;
  584.  
  585.     case OPTIONS: 
  586.              switch(ItemNum) {
  587.         case CHANGEMAG: GetMags(); /* put up requester for mag. */
  588.                 break;
  589.  
  590.         case CHANGECLK:  GetTimes(); /* put up the timedelay req.*/
  591.                                  break;
  592.  
  593.         case DISBOTH: DisplayFlags = 3; break;
  594.         case DISSTAR: DisplayFlags = 1; break;
  595.         case DISINFO: DisplayFlags = 2; break;
  596.  
  597.         case CHANGECOL:
  598.                   SetColors();
  599.                               break;
  600.  
  601.         case OPTHELP:
  602.                do_help_req(OPTIONS);
  603.                break;
  604.          }
  605.          break;
  606.  
  607.   } /* end MenuNum switch */
  608.   } /* end of main menu processing */
  609.   
  610.  else { /* Constellation menu processing */ 
  611.        if (MenuNum ==  CONOPTIONS)
  612.         {
  613.              switch(ItemNum) {
  614.         case CONDISSTAR: 
  615.             ConDispFlags &= ~2;                
  616.                 ConDispFlags |= 1;
  617.              break;
  618.  
  619.                 case CONDISBOTH:
  620.                         ConDispFlags |= 3;
  621.                         break;
  622.                         
  623.         case CONDISINFO:
  624.                         ConDispFlags &= ~1;
  625.                 ConDispFlags |= 2;
  626.                 break;
  627.                 
  628.         case CONDISMAJ:
  629.             ConDispFlags ^= 4;
  630.             break;
  631.                 
  632.         case CONDISZOD:  /* highlight the Zodiac Constellations */
  633.                      sprintf(WTMessage,
  634.                            "Constellations of The Zodiac:");
  635.                      SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  636.                      for (i=0; i<12; i++)
  637.                          PlotConst(ConstList[ZodCons[i]],1,ConDispFlags);
  638.                      Delay(150L);
  639.                      for (i=0; i<12; i++)
  640.                         {
  641.                          nconstars = PlotConst(ConstList[ZodCons[i]],3,ConDispFlags);
  642.                          if (nconstars != 0)
  643.                  { sprintf(WTMessage,
  644.                                "Constellations of The Zodiac: %s - The %s",
  645.                 Constel[ZodCons[i]].ConsName,
  646.                 Constel[ZodCons[i]].ConsMean);
  647.                               SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  648.                               for (j = 0; j < 3; j++) /* blink the const. */
  649.                                 {
  650.                                   Delay(60L);
  651.                                   PlotConst(ConstList[ZodCons[i]],2,ConDispFlags);
  652.                                   Delay(60L);
  653.                                   PlotConst(ConstList[ZodCons[i]],3,ConDispFlags);
  654.                                 }
  655.                               Delay(50L);
  656.                               PlotConst(ConstList[ZodCons[i]],1,ConDispFlags);
  657.                            }
  658.             }
  659.                      for (i=0; i<12; i++)
  660.                          PlotConst(ConstList[ZodCons[i]],0,ConDispFlags);
  661.                      SetWindowTitles(w,WinTitle,(UBYTE *)-1);
  662.                      break;
  663.                 
  664.                 case CONDISMES:
  665.                      sprintf(WTMessage,
  666.                      "Galaxies and Nebulous Objects of the Messier Catalog");
  667.                      SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  668.              PlotObjects('M',1);
  669.                      Delay(200L);
  670.                      PlotObjects('M',0);
  671.                      SetWindowTitles(w,WinTitle,(UBYTE *)-1);
  672.  
  673.                      break;
  674.                      
  675.                 case CONDISNGC:
  676.                      sprintf(WTMessage,
  677.                      "Galaxies and Nebulous Objects of the NGC Catalog");
  678.                      SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  679.              PlotObjects('N',1);
  680.                      Delay(200L);
  681.              PlotObjects('N',0);
  682.                      SetWindowTitles(w,WinTitle,(UBYTE *)-1);
  683.  
  684.                      break;
  685.                      
  686.                      
  687.         case CONHELP:
  688.                do_help_req(CONHELP); /* 7 for constellation help */
  689.                break;
  690.                 
  691.         case CONRETURN: /* restore the main menu */
  692.             ClearMenuStrip(w);
  693.                         SetMenuStrip(w,Titles);
  694.             MenuFlag = TRUE;
  695.                 break;
  696.                                
  697.           };
  698.         } /* end of conoptions menu processing */
  699.      else
  700.        { constindex = ((MenuNum - 1)*20) + (ItemNum + 1);
  701.          if (ConDispFlags & 1)    
  702.             { if(PlotConst(ConstList[constindex],1,ConDispFlags))
  703.                {  sprintf(WTMessage,
  704.                            "The Constellation of %s - The %s",
  705.                              Constel[constindex].ConsName,
  706.                  Constel[constindex].ConsMean);
  707.                   SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  708.                   Delay(200L);
  709.                   SetWindowTitles(w,WinTitle,(UBYTE *)-1);
  710.                }
  711.               else
  712.                 {  sprintf(WTMessage,
  713.                    "%s - The %s - is not currently visible",
  714.                              Constel[constindex].ConsName,
  715.                  Constel[constindex].ConsMean);
  716.                   SetWindowTitles(w,WTMessage,(UBYTE *)-1);
  717.               ErrorMessCount = 5; /* leave it for  seconds */
  718.               return;
  719.                }
  720.             if (ConDispFlags & 2)
  721.                { conlist = ConstList[constindex]; 
  722.              DisplayInfo(conlist+1,*conlist,1,ConDispFlags);
  723.            }
  724.             PlotConst(ConstList[constindex],0,ConDispFlags); /* clear any highlighting */
  725.            } /* end of star display part */  
  726.         else if (ConDispFlags & 2)
  727.                { conlist = ConstList[constindex]; 
  728.              DisplayInfo(conlist+1,*conlist,0,ConDispFlags);
  729.            }
  730.  
  731.        }
  732.  
  733.     } /* end of constellation menu processing */
  734.    
  735. }
  736.  
  737.  
  738. /***************************************************************************
  739.         InitConMenu
  740. ***************************************************************************/
  741.  
  742. struct IntuiText GenericText = { 0, 1, JAM1, 0, 1, NULL, NULL, NULL };
  743. struct MenuItem GenericItem =
  744.     {
  745.         NULL, 0, 0, 135, 8, ITEMENABLED | ITEMTEXT | HIGHCOMP,
  746.         0L, NULL, NULL, '\0', NULL, 0 
  747.     };
  748.  
  749. InitConMenu ()
  750. {
  751.      struct IntuiText *menu_text;
  752.      struct MenuItem  *menu_items;
  753.      struct cons_rec *consdata;
  754.      SHORT i, LEdge, height;
  755.  
  756.      menu_text = &ConNameText[0];
  757.      menu_items = &ConNameItems[0];
  758.      consdata = &Constel[1];
  759.      height = 0;
  760.  
  761.      for (i=0; i<60; i++)
  762.         {
  763.           /*
  764.            Doing structure assignments is not portable, but then this stuff
  765.            would only work on an Amiga anyway since it is made for one.
  766.           */
  767.           *menu_text = GenericText;
  768.           *menu_items = GenericItem;
  769.  
  770.           menu_text->IText = (UBYTE *)consdata->ConsName;
  771.           menu_items->NextItem = menu_items+1;    /* Link to next menu item */
  772.           menu_items->TopEdge = height;
  773.           menu_items->ItemFill = (APTR)menu_text;
  774.  
  775.           height += 9;
  776.           if ((i == 19)||(i == 39))
  777.             { menu_items->NextItem = NULL;
  778.               height = 0;
  779.             }
  780.  
  781.           /* Increment all of the pointers */
  782.           menu_text++;
  783.           menu_items++;
  784.           consdata++;
  785.     }
  786.  
  787.     (menu_items-1)->NextItem = NULL;
  788. }
  789.  
  790.